/* 532. 数组中的 k-diff 数对 */
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findPairs = function (nums, k) {
	let ans = 0
	const map = new Map()
	nums.sort((a, b) => a - b)
	map.set(nums[0], { visited: false })
	for (let i = 0; i < nums.length; i++) {
		if (i) {
			const other = nums[i] - k
			if (map.has(other) && !map.get(other).visited) {
				map.set(other, { visited: true })
				ans++
			}
		}
		!map.has(nums[i]) && map.set(nums[i], { visited: false })
	}
	return ans
}
/* 哈希表 */
var findPairs = function (nums, k) {
	const visited = new Set()
	const res = new Set()
	for (const num of nums) {
		/* 取较大值  */
		if (visited.has(num - k)) {
			res.add(num)
		}
		if (visited.has(num + k)) {
			res.add(num + k)
		}
		/* 
            取较小值 
            if (visited.has(num - k)) {
			    res.add(num - k)
            }
            if (visited.has(num + k)) {
                res.add(num )
            }
        */
		visited.add(num)
	}
	return res.size
}
/* 
    排序 + 双指针 
    数对的两个元素的下标值不同，当k=0时，数对的两个元素值可以相同，但下标值必须不同
    数对的两个元素差值为k

    x < y
    nums[x] + k = nums[y]

    求满足x || y的个数
*/
var findPairs = function (nums, k) {
	nums.sort((a, b) => a - b)
	let n = nums.length,
		y = 0,
		res = 0
	for (let x = 0; x < n; x++) {
		if (x === 0 || nums[x] !== nums[x - 1]) {
			while (y < n && (nums[y] < nums[x] + k || y <= x)) {
				y++
			}
			if (y < n && num[y] === num[x] + k) {
				res++
			}
		}
	}
}
const ans = findPairs([1, 1, 3, 4, 5], 2)
console.log('ans :>>', ans)
